abstract version control